![【小ネタ】TypeORMからMySQLに接続する際program_nameを明示して各種調査の助けにする](https://devio2023-media.developers.io/wp-content/uploads/2021/02/eyecatch-mysql-2.png)
【小ネタ】TypeORMからMySQLに接続する際program_nameを明示して各種調査の助けにする
CX事業本部@大阪の岩田です。
MySQL5.7から利用可能になったsys.sessionは現在実行中のユーザーセッションに関する情報が確認できるviewです。このviewを通して実行中のSQLをはじめロックに関する情報やトランザクションに関する情報など、様々な情報が確認できます。このように有事の調査に大活躍するsys.sessionですが、このviewにはprogram_nameというカラムがあり、このカラムを有効活用することで接続元のクライアントを識別するのが容易になります。program_nameはクライアントがMySQLサーバーに接続する際に自分で指定する項目で、いわばクライアントがMySQLサーバーに対して「自分のプログラム名はxxです」と「名乗っている」と捉えて良いかもしれません。MySQLのクライアントプログラムを扱う場合は適切なprogram_nameを指定することで、有事の調査がスムーズに進むように備えておきたいところです。
現在自分が関わっているシステムではMySQLにアクセスするためにTypeORMとNode MySQL 2を利用しているのですが、MySQL接続時にprogram_nameを指定してみたので、簡単にではありますが設定手順をご紹介します。
ライブラリのバージョン
今回利用したライブラリのバージョンは以下の通りです
- TypeORM: 0.3.9
- Node MySQL 2: 2.3.3
やってみる
TypeORMから普通にMySQLに接続してみる
まずTypeORMの使い方についておさらいです。MySQLに接続する際は以下のようなコードを記述します。
const AppDataSource = new DataSource({ type: 'mysql', host: 'MySQLサーバーのホスト名やIPアドレス', username: 'DBユーザー名', password: 'パスワード', }) // AppDataSourceを利用する諸々のコードを記述
このようなコードで接続すると、sys.session
のprogram_nameはNULLになります。
mysql> select thd_id,conn_id,user,db,program_name from sys.session ; +--------+---------+---------------------+----------+--------------+ | thd_id | conn_id | user | db | program_name | +--------+---------+---------------------+----------+--------------+ | 52 | 10 | typeorm@172.18.0.1 | typeorm | NULL | | 51 | 9 | root@localhost | mysql | mysql | +--------+---------+---------------------+----------+--------------+
TypeORMからprogram_nameを指定してMySQLに接続してみる
program_nameを指定して接続するには以下のようにします。
const AppDataSource = new DataSource({ type: 'mysql', host: 'MySQLサーバーのホスト名やIPアドレス', username: 'DBユーザー名', password: 'パスワード', extra: { connectAttributes: { program_name: 'TypeORM', }, }, }) // AppDataSourceを利用する諸々のコードを記述
元々のコードに extra
を追加しています。このextra
で指定したオブジェクトはTypeORMの下層で利用しているDBドライバのオプションに直接渡されます。今回のケースだとDBドライバにはNode MySQL 2を利用しているので、Node MySQL2のオプションにconnectAttributes
を指定したのと同じ効果になります。このconnectAttributes
というオブジェクトでprogram_nameを指定すると、指定した文字列がsys.session
のprogram_nameにも反映されます。
改めてsys.session
を確認すると...
mysql> select thd_id,conn_id,user,db,program_name from sys.session ; +--------+---------+---------------------+----------+-----------------+ | thd_id | conn_id | user | db | program_name | +--------+---------+---------------------+----------+-----------------+ | 52 | 10 | typeorm@172.18.0.1 | typeorm | TypeORM | | 51 | 9 | root@localhost | mysql | mysql | +--------+---------+---------------------+----------+-----------------+
無事にprogram_nameが反映されました!
まとめ
ものすごく地味な改善ではありますが、こういう細かな積み重ねがシステムの保守性に影響してきます。運用開始当初は1つのシステムからしかDBに接続していなかったのに、時を経るにつれて別の外付けプログラムからもDBに接続するようになり...というのは割とシステムあるあるだと思うので、初期開発時からこういった細かな小技を意識しておきたいですね。